home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 6 / MacMania 6.toast / / Multimedia & Desktop / VideoToolbox / VideoToolboxSources / Require.c < prev    next >
Text File  |  1997-07-01  |  6KB  |  150 lines

  1. /*
  2. Require.c
  3.  
  4. Require(long quickDrawVersion);
  5. checks that the computer is providing the environment that your program needs
  6. (cpu, fpu, and quickDraw), and fails gracefully if not. Also checks for
  7. consistency of sizeof int and double among this program, the (possibly
  8. precompiled) VideoToolbox.h header, and the Standard C library (i.e. "ANSI").
  9.  
  10. Call this at the beginning of your main program, so that your program will
  11. fail gracefully--instead of crashing--when someone runs it on a computer
  12. that lacks what your program needs, or when you've accidentally set up
  13. inconsistent compiler options among the various parts of your project. All
  14. tests automatically track your current compiler settings.
  15.  
  16. Here are the versions of quickdraw, as of System 7.1:
  17.  
  18.  gestaltOriginalQD = 0x000,    // original 1-bit QD
  19.  gestalt8BitQD = 0x100,        // 8-bit color QD
  20.  gestalt32BitQD = 0x200,    // 32-bit color QD
  21.  gestalt32BitQD11 = 0x210,    // 32-bit color QDv1.1
  22.  gestalt32BitQD12 = 0x220,    // 32-bit color QDv1.2
  23.  gestalt32BitQD13 = 0x230,    // 32-bit color QDv1.3
  24.  
  25. QuickDraw version 1.3, which is in System 7.0, is the first version of
  26. QuickDraw in which the Apple Toolbox call GetPixBaseAddr() works
  27. correctly; earlier versions return garbage.
  28.  
  29.      ==================================================================
  30.      ROM Class             System Version       Gestalt Value
  31.      ------------------------------------------------------------------
  32.      Black-and-white class <  7.0               gestaltOriginalQD
  33.      (ROM < 256K)          >= 7.0               gestaltOriginalQD
  34.                                       and gestaltSystemVersion >= $0700
  35.  
  36.      Color QD class        <  7.0, no INITs     gestalt8BitQD
  37.      (ROM = 256K)          6.0.3/6.0.4 and      gestalt32BitQD
  38.                            32-Bit QD INIT 1.0
  39.                            6.0.5-6.0.8 and      gestalt32BitQD12
  40.                            32-Bit QD INIT 1.2
  41.                            >= 7.0               gestalt32BitQD13
  42.  
  43.      ci class              6.0.4                gestalt32BitQD + 1
  44.      (ROM > 256K)          6.0.5-6.0.8          gestalt32BitQD12
  45.                            >= 7.0               gestalt32BitQD13
  46.      ==================================================================
  47.      (Source: Develop Issue 14, June 1993)
  48.  
  49. The types SCANF_INT, PRINTF_INT, SCANF_DOUBLE, and PRINTF_DOUBLE are for
  50. compatibility with MATLAB. When MATLAB is false they're just int and double.
  51. We check both sprintf and sscanf since those are the most likely to break
  52. if the MATLAB interface isn't set up correctly. When MATLAB is false this
  53. is overkill, but does confirm that the ANSI library is compatible with the
  54. current compiler options.
  55.  
  56. HISTORY:
  57. 2/20/93    dgp    Wrote it, motivated by a conversation with David Brainard.
  58. 9/8/93    dgp    Enhanced to check for inconsistent sizes of int and double.
  59. 9/13/93    dgp Moved Require to its own file.
  60. 5/8/95 dgp Make sure that fpu test works ok by moving all the fpu code to
  61. separate subroutine. Otherwise the compiler may put instructions to access 
  62. the fpu at the beginning of Require, before we have a chance to test for 
  63. presence of the fpu.
  64. 9/30/96 dhb Pulled out some old MATLAB dependent stuff (i.e. DOUBLE, etc.)
  65. 10/2/96 dgp cosmetic editing of comments.
  66. */
  67. #include "VideoToolbox.h"
  68. static void RequireConsistency(void);
  69.  
  70. void Require(long quickDrawVersion)
  71. {
  72.     #if MAC_C
  73.         long value;
  74.         int error;
  75.  
  76.         value=0;
  77.         error=Gestalt(gestaltFPUType,&value);
  78.         if(error)PrintfExit("Sorry, I require Gestalt(). Your System is too old!\n");
  79.         if(GENERATING68881 && value==0)
  80.             PrintfExit("Sorry. I've been compiled to use a floating point chip,"
  81.                 " and you don't have one.\n");
  82.         value=0;
  83.         error=Gestalt(gestaltProcessorType,&value);
  84.         if(GENERATING68020 && value<gestalt68020)
  85.             PrintfExit("Sorry. I've been compiled to use a 68020 processor (or better),"
  86.                 " and you don't have one.\n");
  87.         Gestalt(gestaltQuickdrawVersion,&value);
  88.         if(value<quickDrawVersion)switch(quickDrawVersion){
  89.             case gestalt8BitQD:
  90.                 PrintfExit("Sorry. This program requires Color QuickDraw.\n");
  91.             default:
  92.                 PrintfExit("Sorry. This program requires 32-bit QuickDraw version 1.%ld\n"
  93.     ,(long)(quickDrawVersion-gestalt32BitQD)/0x10);
  94.         }
  95.     #endif
  96.     RequireConsistency();
  97. }
  98.  
  99. static void RequireConsistency(void)
  100. {
  101.     short inconsistent;
  102.     int n[3];
  103.     double a[5];
  104.     char s[16];
  105.     static char programVsLibrary[]=
  106.         "Oops. %s error. This program and the Standard C “ANSI” library have been\n"
  107.         "compiled with incompatible %s.\n";
  108.  
  109.     inconsistent=0;
  110.     if(sizeof(int)!=sizeof(struct PrecompileSizeofInt)){
  111.         inconsistent=1;
  112.         printf("Oops. "
  113.         "The VideoToolbox.h header has been precompiled with a different size\n"
  114.         "of int.\n");
  115.     }
  116.     sprintf(s,"%d,%d",1,-1);
  117.     if(strcmp(s,"1,-1")!=0){
  118.         inconsistent=1;
  119.         printf(programVsLibrary,"sprintf","sizes of int");
  120.     }
  121.     n[2]=1;
  122.     sscanf("1,-1","%d,%d",&n[0],&n[1]);
  123.     if(n[0]!=1 || n[1]!=-1 || n[2]!=1){
  124.         inconsistent=1;
  125.         printf(programVsLibrary,"sscanf","sizes of int");
  126.     }
  127.     sprintf(s,"%g,%g",(PRINTF_DOUBLE)1.0,(PRINTF_DOUBLE)0.1);
  128.     if(strcmp(s,"1,0.1")!=0){
  129.         inconsistent=1;
  130.         printf(programVsLibrary,"sprintf","formats for double");
  131.         //printf("“%s”≠“%s”\n",s,"1,0.1");
  132.         assert(sizeof(PRINTF_DOUBLE)==sizeof(double));
  133.     }
  134.     a[2]=1.0;
  135.     sscanf("1,0.1","%lf,%lf",&a[0],&a[1]);
  136.     if(a[0]!=1.0 || a[1]!=0.1 || a[2]!=1.0){
  137.         inconsistent=1;
  138.         printf(programVsLibrary,"sscanf","formats for double");
  139.         //printf("“%s”≠“%f,%f,%f”\n","1,0.1,1",a[0],a[1],a[2]);
  140.     }
  141.     if(sqrt(0.1*0.1)!=0.1){
  142.         inconsistent=1;
  143.         printf("Oops: sqrt(0.1*0.1)!=0.1\n"
  144.         "Perhaps this program and the Standard C “ANSI” library have been\n"
  145.         "compiled with incompatible formats for double.\n");
  146.     }
  147.     if(inconsistent)PrintfExit("");    /* Use empty string since stdio may be flakey. */
  148. }
  149.  
  150.